TOP
LibreOffice Calc के लिए फ़ज़ी लुकअप
FUZZYLOOKUP() विवरण
हम सभी सुप्रसिद्ध VLOOKUP() फ़ंक्शन को जानते हैं जो हमें विभिन्न तालिकाओं से डेटा को संयोजित करने में मदद करता है। हालाँकि, इस फ़ंक्शन में एक महत्वपूर्ण खामी है - यह समान मानों को संयोजित नहीं कर सकता है, अर्थात, यदि शब्द में कोई त्रुटि है, तो कोई मिलान नहीं होगा।
अनुमानित मानों को संयोजित करने में सक्षम होने के लिए, हम अपना स्वयं का फ़ंक्शन बना सकते हैं। चलिए इसे FuzzyLookup() कहते हैं।
आइए कल्पना करें कि हमारे पास दो सूचियाँ हैं। दोनों में लगभग समान तत्व हैं, लेकिन उन्हें थोड़ा अलग तरीके से लिखा जा सकता है। कार्य पहली सूची में प्रत्येक तत्व के लिए दूसरी सूची से सबसे समान तत्व ढूंढना है, अर्थात। निकटतम अधिकतम समान पाठ के लिए खोज लागू करें।
ऐसे में बड़ा सवाल यह है कि "समानता" की कसौटी पर क्या विचार किया जाए। केवल मेल खाने वाले वर्णों की संख्या? क्या लगातार मैचों की संख्या है? क्या कैरेक्टर केस या रिक्त स्थान पर विचार किया जाना चाहिए? किसी वाक्यांश में शब्दों की भिन्न-भिन्न व्यवस्था का क्या करें? कई विकल्प हैं और कोई एक समाधान नहीं है - प्रत्येक स्थिति के लिए कोई न कोई स्थिति दूसरों से बेहतर होगी।
हमारे मामले में, हम सबसे सरल विकल्प लागू करते हैं - वर्ण मिलानों की अधिकतम संख्या के आधार पर खोजें। यह सही नहीं है, लेकिन अधिकांश स्थितियों के लिए यह बहुत अच्छा काम करता है।
StarBASIC फ़ंक्शन के लिए कोड FuzzyLookup
जमा करना फ़ंक्शन FuzzyLookup , मेनू खोलें Tools - Macros - Edit Macros... , चुनना Module1 और निम्नलिखित पाठ को मॉड्यूल में कॉपी करें:
- Function FuzzyLOOKUP(LookupValue As String, SrcTable As Variant, Optional SimThreshold As Single) As String
-
- Dim Str As String
- Dim CellArray As Variant
- Dim StrArray As Variant
-
- If IsMissing(SimThreshold) Then SimThreshold = 0
-
- Str = LCase(LookupValue)
- StrArray = Split(Str)
- StrExt = UBound(StrArray)
-
- For Each Cell In SrcTable
-
- CellArray = Split(LCase(Cell))
- CellExt = UBound(CellArray)
- CellRate = 0
-
-
- For x = 0 To StrExt
-
- StrWord = StrArray(x)
- If Len(StrWord) = 0 Then GoTo continue_x
- MaxStrWordRate = 0
-
-
- For i = 0 To CellExt
-
- CellWord = CellArray(i)
- If Len(CellWord) = 0 Then GoTo continue_i
-
- FindCharNum = OccurrenceNum(StrWord, CellWord)
- StrWordRate = FindCharNum / Max(Len(StrWord),Len(CellWord))
-
- If StrWordRate > MaxStrWordRate Then MaxStrWordRate = StrWordRate
- continue_i:
- Next i
-
- CellRate = CellRate + MaxStrWordRate
- continue_x:
- Next x
-
-
- If CellRate > MaxCellRate Then
- MaxCellRate = CellRate
- BestCell = Cell
-
- FindCharNum = OccurrenceNum(Str, Cell)
- SimRate = FindCharNum / Max(Len(Str),Len(Cell))
- End If
-
- Next Cell
-
- IF SimRate >= SimThreshold Then
- IF SimThreshold = -1 Then
- ReturnValue = BestCell + " (" + Format(SimRate, "0.00") + ")"
- ElseIf SimThreshold = -2 Then
- ReturnValue = Format(SimRate, "0.00")
- Else
- ReturnValue = BestCell
- End If
- Else
- ReturnValue = ""
- End If
-
- FuzzyLOOKUP = ReturnValue
- End Function
-
-
- Function OccurrenceNum(ByVal SourceString As String, ByVal TargetString As String)
- For i = 1 To Len(SourceString)
-
- Position = InStr(1, TargetString, Mid(SourceString, i, 1), 1)
-
- If Position > 0 Then
- Count = Count + 1
-
- TargetString = Left(TargetString, Position - 1) + Right(TargetString, Len(TargetString) - Position)
- End If
- Next i
- OccurrenceNum = Count
- End Function
-
-
- Function Max(ByVal value1 As Variant, ByVal value2 As Variant)
- If value1 > value2 Then
- Result = value1
- Else
- Result = value2
- End If
- Max = Result
- End Function
Function FuzzyLOOKUP(LookupValue As String, SrcTable As Variant, Optional SimThreshold As Single) As String
' moonexcel.com.ua
Dim Str As String
Dim CellArray As Variant
Dim StrArray As Variant
If IsMissing(SimThreshold) Then SimThreshold = 0
Str = LCase(LookupValue)
StrArray = Split(Str)
StrExt = UBound(StrArray)
For Each Cell In SrcTable
CellArray = Split(LCase(Cell))
CellExt = UBound(CellArray)
CellRate = 0
' हम खोज वाक्यांश में प्रत्येक शब्द की जाँच करते हैं
For x = 0 To StrExt
StrWord = StrArray(x)
If Len(StrWord) = 0 Then GoTo continue_x
MaxStrWordRate = 0
' हम मानों की मूल तालिका से अगले सेल में प्रत्येक शब्द की जांच करते हैं
For i = 0 To CellExt
CellWord = CellArray(i)
If Len(CellWord) = 0 Then GoTo continue_i
FindCharNum = OccurrenceNum(StrWord, CellWord)
StrWordRate = FindCharNum / Max(Len(StrWord),Len(CellWord))
If StrWordRate > MaxStrWordRate Then MaxStrWordRate = StrWordRate
continue_i:
Next i
CellRate = CellRate + MaxStrWordRate
continue_x:
Next x
' हम सबसे अच्छा मेल रखते हैं
If CellRate > MaxCellRate Then
MaxCellRate = CellRate
BestCell = Cell
FindCharNum = OccurrenceNum(Str, Cell)
SimRate = FindCharNum / Max(Len(Str),Len(Cell))
End If
Next Cell
IF SimRate >= SimThreshold Then
IF SimThreshold = -1 Then
ReturnValue = BestCell + " (" + Format(SimRate, "0.00") + ")"
ElseIf SimThreshold = -2 Then
ReturnValue = Format(SimRate, "0.00")
Else
ReturnValue = BestCell
End If
Else
ReturnValue = ""
End If
FuzzyLOOKUP = ReturnValue
End Function
Function OccurrenceNum(ByVal SourceString As String, ByVal TargetString As String)
For i = 1 To Len(SourceString)
' हम प्रत्येक प्रतीक की घटना की तलाश कर रहे हैं
Position = InStr(1, TargetString, Mid(SourceString, i, 1), 1)
' हम संयोगों का काउंटर बढ़ाते हैं
If Position > 0 Then
Count = Count + 1
' पाए गए प्रतीक को हटा दें
TargetString = Left(TargetString, Position - 1) + Right(TargetString, Len(TargetString) - Position)
End If
Next i
OccurrenceNum = Count
End Function
Function Max(ByVal value1 As Variant, ByVal value2 As Variant)
If value1 > value2 Then
Result = value1
Else
Result = value2
End If
Max = Result
End Function
अगला, बंद करें Macro Editor और वर्कशीट पर वापस लौटें LibreOffice Calc - अब आप हमारी नई सुविधा का उपयोग कर सकते हैं FuzzyLookup() .
एक्सटेंशन का उपयोग करना
आप भी फीचर का इस्तेमाल कर सकते हैं FUZZYLOOKUP() निःशुल्क एक्सटेंशन इंस्टॉल करके YouLibrecalc.oxt या इसका पूर्ण विशेषताओं वाला संस्करण YLC_Utilities.oxt .
उसके बाद, यह फ़ंक्शन उन सभी फ़ाइलों में उपलब्ध होगा जो LibreOffice Calc में खोली जाएंगी।